package code15Lambda表达式;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
import java.util.function.UnaryOperator;
import java.util.stream.Stream;

/**
 * @author 黄衡熙
 * @version 1.0
 */
public class Test08_创建Stream对象 {
    public static void main(String[] args) {
        // 方式一:Collection体系集合
        List<Integer> list = Arrays.asList(1, 3, 5, 6, 8, 12);
        //创建对象
        Stream<Integer> stream = list.stream();
        System.out.println(stream);
        // 最终效果需要通过终止操作来展示
        // foreach是一个用于迭代Stream中所有元素的终止操作
        stream.forEach(System.out::println);//终止操作
        System.out.println("******************************************************");

        // 方式二:Map体系集合
        Map<Integer, String> map = new HashMap<>();
        map.put(1, "admin");
        map.put(2, "jack");
        map.put(3, "tom");
        // 将Map中的key存放到Set集合中进行转换
        //创建对象
        Stream<Integer> keyStream = map.keySet().stream();
        keyStream.forEach(System.out::println);
        // 可以通过Entry类来实现
        Stream<Map.Entry<Integer, String>> entryStream = map.entrySet().stream();
        entryStream.forEach(System.out::println);
        System.out.println("******************************************************");

        // 方式三:数组类型
        Integer[] arr = {1, 3, 4, 5, 7, 8, 9};
        Stream<Integer> s = Arrays.stream(arr);
        // 数组可以使用可变长方法
        s = Stream.of(arr);
        s.forEach(System.out::println);
        System.out.println("******************************************************");

        // 方式四:可变长参数
        Stream<Integer> s2 = Stream.of(1, 3, 4, 6);
        // 可变长不能使用数组方法
        // s2 = Arrays.stream(1, 3, 4, 5, 6);
        s2.forEach(System.out::println);

       /* // 方式五:无限流,指定起始值以及下一个值的变化,不指定数量,无限循环
        UnaryOperator<Integer> operator = UnaryOperator.identity();
        // 通过iterate方法创建一个无限流,需要指定两个参数
        // 参数一:起始值
        // 参数二:下一个值的变化,可以通过官方提供的函数式接口实现
        // UnaryOperator用于获取下一个值,下一个值与当前值一致
//        Stream<Integer> s3 = Stream.iterate(1, operator);
//        s3.forEach(System.out::println);
        // 如果不希望值相同,可以自定义规则
//        Stream<Integer> s4 = Stream.iterate(1, i -> i + 1);
//        Stream<Integer> s4 = Stream.iterate(1, i -> i + 2);
        Stream<Integer> s4 = Stream.iterate(0, i -> i + 2);
        s4.forEach(System.out::println);*/

    }
}
